package com.thinking.in.spring.ioc.dependency.injection;

import com.think.in.spring.ioc.overview.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

import javax.annotation.Resource;

/**
 * 依赖注入 - 字段 ：
 *      1 ：Annotation的方式
 * @author zjiajia
 * @date 2021/12/31 13:17
 */
public class AnnotationDependencyFieldInjectionDemo {

    /**
     * 通过注解的方式，将 Bean注入
     *
     *
     * AnnotationDependencyFieldInjectionDemo 本身 就是一个Spring Bean
     *
     * 在容器 refresh 的时候，这里面的@AutoWired  或者 @Resource 注解的Field 会注入到对象中去
     */
    @Autowired
    private UserHolder userHolder;

    @Resource
    private UserHolder userHolder2;
    /**
     * 静态的字段，注入的时候，会忽略掉
     */
    @Autowired
    static UserHolder userHolder3;


    public static void main(String[] args) {
        // 创建 BeanFactory
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // xml Bean定义信息 Reader
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
        // 加载配置信息  ，解析 装载 配置文件
        xmlBeanDefinitionReader.loadBeanDefinitions("classpath:/META-INF/dependency-lookup-context.xml");

        // 注册 configuration Class (配置类)
        applicationContext.register(AnnotationDependencyFieldInjectionDemo.class);

        // 启动Spring 应用上下文
        applicationContext.refresh();

        AnnotationDependencyFieldInjectionDemo demo = applicationContext.getBean(AnnotationDependencyFieldInjectionDemo.class);

        UserHolder userHolder = demo.userHolder;
        System.out.println("userHolder :  " + userHolder);
        UserHolder userHolder2 = demo.userHolder2;
        System.out.println("userHolder 2 : " + userHolder2);


        System.out.println("if userHolder  ==  userHolder2 : " + (userHolder == userHolder2));
        // 关闭应用上下文
        applicationContext.close();


    }

    /**
     * 注解的形式 ： 首先拿到 UserHolder Bean
     *      让后将 User 作为参数传入
     * @param user      user
     * @return          userHolder
     */
    @Bean
    public UserHolder userHolder(User user){

        return new UserHolder(user);
    }
}
